package wsh;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;


public class Server {
    //用于保存Socket的集合，也可以说是把个C端与S端的一个连接通道保存起来
    //作用：服务器将接收到的信息发给集合里的所以socket，也就是发给每个C端
    public static List<Socket> list = new ArrayList<Socket>();

    public static void main(String[] args) {
        new ServerFrame("黄金点");
    }

}

/*
 * 继承Jframe类表示该类可以创建一个窗口程序了，
 * 实现ActionListener：动作监听，在S端点击“启动服务器”是要执行的代码
 * 实现Runnable：实现多线程，该窗口是个客户端窗口，要开启一个线程接收显示服务器发过来的信息
 */
class ServerFrame extends JFrame implements ActionListener, Runnable {

    private static final long serialVersionUID = 1L;

    private ServerSocket serverSocket = null;

    private Socket socket;

    private JButton start;
    private JTextArea message;

    public ServerFrame(String name) {
        super(name);

        start = new JButton("黄金点");
        start.addActionListener(this);
        message = new JTextArea();
        message.setEditable(false);
        this.add(start, "North");
        this.add(message, "Center");

        this.setResizable(false);
        this.setBounds(0, 0, 400, 300);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == start) {
            // 如果点击的按钮是开始按钮。则启动服务器。
            try {
                serverSocket = new ServerSocket(6666);
                message.setText("服务器已启动。。。");
                
                //单击“启动服务器”开启一个线程用于获取用户上线的情况
                new Thread(this).start();
                
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    //获取C端上线的情况
    @Override
    public void run() {
        String address = null;
        int port = 0;
        //用一个死循环一直让S端开启接收C端的连接，将C端的IP和端口显示在面板上
        //如果用循环的话就只能接收一次
        while (true) {
            try {
                socket = serverSocket.accept();
                Server.list.add(socket);
                address = socket.getInetAddress().getHostAddress();
                port = socket.getPort();
                message.append("\r\nip/" + address + ":" + port + "\t上线了");
                
               
            } catch (IOException e) {
//                System.out.println(address + ":" + port + "\t退出了服务器");
            }
        }
    }

}

